**Сферический куб**

## Где используется

* Рисование планет.
* Вывод кубических текстур (skybox) и видео 360/VR.


## Виды проекций

В статье [Cube-to-sphere Projections for Procedural Texturing and Beyond](https://www.jcgt.org/published/0007/02/01/paper.pdf) исследованы различные виды проекций:

![](img/SC_Proj.png)

На картинке цветом обозначена площадь треугольника, более равномерный цвет характеризует равномерную площадь треугольников на сфере.<br/>
[Исходник теста](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/sphere/SphericalCube-1.as).

Проекции 5th Poly и COBE в шейдере дают наименьшую точность расчетов. В тесте берется развертка сферы и применяются обратная и прямая проекции, сравниваются вектора и выводится погрешность.<br/>
[Исходник теста](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/tests/CubeMapTest-1.as).


## Проекция текстуры

![](img/SC_TexProj.png)

В tangential проекции текстурные координаты такие же как в identity, но за счет трансформации вершин текстура накладывается более равномерно.<br/>
Если использовать координаты вершин как текстурные координаты, то искажения текстуры соответствуют identity проекции.

При применении проекции, кроме identity, текстурные координаты перестают соответствовать 3D вектору, тогда при записи в текстуру требуется применять проекцию.<br/>
Для всех проекций UV координаты грани куба перестают быть прямоугольными, то есть все формы искажаются.<br/>
UV куба дает распределение,  близкое к равномерному. При этом чем лучше проекция, тем равномернее результат.<br/>
[Исходник теста](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/sphere/SphericalCube-2.as).


## Топология

![](img/SC_Topology.png)

Обычная сетка после проецирования дает сильно искаженные треугольники, поэтому сетка должна быть симметричной относительно центра грани.


## Проекция из 3D

### Искажения

![](img/SC_Distortion.png)

Пример проекции сферы (круга) на сферический куб, ближе к грани куба начинаются небольшие искажения, для круга это не критично.<br/>
Проекция прямоугольника на сферический куб не имеет искажений только в центре грани куба, на краях начинаются искажения, но радиус вписанной окружности не меняется.<br/>
[Исходник теста](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/sphere/SphericalCube-3.as)


### Погрешность интерполяции

![](img/SC_ProjError.png)

Тест показывает погрешность, когда проекция применяется для вершин, а между ними происходит линейная интерполяция. За счет расхождения между проекцией и интерполяцией появляется ошибка. На картинке размер ошибки показан белым цветом, красный - когда ошибка более 1 после масштабирования.

Улучшить точность можно повторив линейную интерполяцию между контрольными точками. На картинке это вариант справа.

Исходники:<br/>
[коррекция в вычислительном шейдере](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/sphere/SphericalCube-4.as).<br/>
[коррекция во фрагментном шейдере](https://gitverse.ru/azhirnov/as-en/content/dev/AE/samples/res_editor/_data/scripts/sphere/SphericalCube-5.as).
